using System;
using System.Collections.Generic;
using System.IdentityModel.Tokens.Jwt;
using System.Linq;
using System.Threading.Tasks;
using IdentityServer4Center.Store;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;

namespace IdentityServer4Center
{
    public class Startup
    {
        // OpenID Connect 实现-> IdentityServer4 = OpenId + OAuth2.0
        // OpenId 用于身份认证（Authentication）
        // OAuth2.0 为web应用提供【授权流程】。流程：用户授权->申请令牌->获取资源
        // OAuth2.0 4种模式
        // 1.客户端模式：客户端请求令牌(Access Token）-> 客户端获取令牌-> 客户端请求资源
        // 2.密码模式：用户将用户名&密码提供给客户端-> 客户端请求令牌(Access Token)-> 客户端获取令牌-> 客户端请求资源
        // 3.授权码模式：用户授权-> 客户端请求授权码（Authorization Code）-> 客户端获取授权码-> 客户端请求令牌(Access Token)-> 客户端获取令牌->客户端请求资源
        // 4.简化模式：用户授权-> 客户端请求令牌(Access Token)-> 客户端获取令牌-> 客户端请求资源
        // http://localhost:8888/.well-known/openid-configuration
        public void ConfigureServices(IServiceCollection services)
        {
            // 客户端授权模式 x-www-from-urlencoded
            //services.AddIdentityServer()
            //.AddDeveloperSigningCredential()
            //.AddInMemoryIdentityResources(Config.GetIdentityResources())
            //.AddInMemoryApiResources(Config.GetApiResources())
            //.AddInMemoryApiScopes(Config.GetApiScopes()) // 内存模式
            //.AddClientStore<ClientStore>() // 集成官方的数据库模式
            //.AddInMemoryClients(Config.GetClients_Client());

            // 资源拥有者密码凭据许可 x-www-from-urlencoded
            //services.AddIdentityServer()
            //.AddDeveloperSigningCredential()
            //.AddInMemoryIdentityResources(Config.GetIdentityResources())
            //.AddInMemoryApiResources(Config.GetApiResources())
            //.AddInMemoryApiScopes(Config.GetApiScopes())
            //.AddInMemoryClients(Config.GetClients_Password())
            //.AddTestUsers(Config.GetTestUsers());

            // 简化模式
            services.AddIdentityServer(options =>
            {
                options.UserInteraction.LoginUrl = "/account/login";
            })
            // 添加证书加密方式，执行该方法，会先判断tempkey.rsa证书文件是否存在，如果不存在的话，就创建一个新的tempkey.rsa证书文件，如果存在的话，就使用此证书文件。
            .AddDeveloperSigningCredential()
            .AddTestUsers(Config.GetTestUsers())
            .AddInMemoryIdentityResources(Config.GetIdentityResources())
            .AddInMemoryApiResources(Config.GetApiResources())
            .AddInMemoryApiScopes(Config.GetApiScopes())
            .AddInMemoryClients(Config.Clients_implicit);

            services.Configure<CookiePolicyOptions>(options =>
            {
                options.MinimumSameSitePolicy = SameSiteMode.Lax;
            });

            services.AddControllersWithViews();
        }

        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseExceptionHandler("/Home/Error");
            }

            app.UseStaticFiles();
            app.UseRouting();
            app.UseIdentityServer();
            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllerRoute(
                    name: "default",
                    pattern: "{controller=Home}/{action=Index}/{id?}");
            });

            //app.UseMvc(routes =>
            //{
            //    routes.MapRoute(
            //        name: "default",
            //        template: "{controller=Home}/{action=Index}/{id?}");
            //});
        }
    }
}